package com.train.springboot.springboottrain.web;

import com.train.springboot.springboottrain.model.Student;
import com.train.springboot.springboottrain.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;


/*  Spring 4 后新增注解，是@Controller 注解功能的增强
是 @Controller 与@ResponseBody 的组合注解
如果一个 Controller 类添加了@RestController，那么该 Controller 类下的所有方法都相当
于添加了@ResponseBody 注解
用于返回字符串或 json 数据
案例：
➢ 创建 MyRestController 类，演示@RestController 替代@Controller + @ResponseBody
        */
@RestController// 相当于在类上面@Controller 方法上添加@ResponseBody，所有方法返回的都是JSON对象
public class MyRestController {
    @Autowired
    private StudentService studentService;

    @RequestMapping("/student")
    public Object student(){
        Student student=new Student();
        student.setId(200);
        student.setName("李四");
        return student;
    }
//该方法请求方式支持：GET和POST请求
    @RequestMapping(value = "/queryById",method = {RequestMethod.GET,RequestMethod.POST})
    public Object queryById(Integer id){
        Student student = new Student();
        student.setId(id);
        return student;
    }

  /*  @RequestMapping(value = "/queryById2",method = RequestMethod.GET)*/
    @GetMapping(value = "/queryById2")//只接收get请求，请求方式不对，会报405错误
    //通常在-------------查询-数据时候使用 ->查询
    public Object queryById2(){

        return "Only GET Method";
    }
 /*     @RequestMapping(value = "/insert",method = RequestMethod.POST)*/
    @PostMapping(value = "/insert")
    //通常在-----------新增-数据时候使用 ->新增Post
      public Object insert(){

          return "Insert success";
      }

 /*     @RequestMapping(value = "/delete",method = RequestMethod.DELETE)*/
      @DeleteMapping(value = "/delete")
      //  ---------------------------删除->Delete
    public  Object delete(){

        return "Delete Student";
      }

/*      @RequestMapping(value = "/update",method = RequestMethod.PUT)*/
      @PutMapping(value = "/update")
      //------------------------------更新->PUT
    public Object update(){

          return "Update Student Info";
      }
/*1.Spring 4 后新增注解，是@Controller 注解功能的增强
是 @Controller 与@ResponseBody 的组合注解
如果一个 Controller 类添加了@RestController，那么该 Controller 类下的所有方法都相当于添加了@ResponseBody 注解用于返回字符串或 json 数据
演示@RestController 替代@Controller + @ResponseBody
2.SpringBoot项目 实现SpringMVC 四种请求注解
@RequestMapping（常用）
支持 Get 请求，也支持 Post 请求

2.1、@GetMapping
RequestMapping 和 Get 请求方法的组合
只支持 Get 请求
Get 请求主要用于查询操作

2.2、 @PostMapping
RequestMapping 和 Post 请求方法的组合
只支持 Post 请求
Post 请求主要用户新增数据

2.3 、@PutMapping
RequestMapping 和 Put 请求方法的组合
只支持 Put 请求
Put 通常用于修改数据

2.4、 @DeleteMapping
RequestMapping 和 Delete 请求方法的组合
只支持 Delete 请求
通常用于删除数据

2.5、Http 接口请求工具 Postman 介绍
因为通过浏览器输入地址，默认发送的只能是 get 请求，通过 Postman 工具，可以模拟
发送不同类型的请求，并查询结果，在安装的时候，有些机器可能会需要安装 MicroSort .NET
Framework

*/
    /* -------认识RESTful----------
    * 即 Representational State Transfer 是一种互联网软件架构设计的风格，并
    * 不是标准，只是提出了一组客户端和服务器交互时的 架构理念和设计原则，使接口更简洁、有层次。
    * 任何的技术都可以实现这种理念，如果一个架构符合REST原则，就成为RESTful架构
    * http://localhost:8090/update?id=5&name=Jack
    * 变为
    * http://localhost:8090/update/5/Jack
    *
            ---SpringBoot 开发RESTful
         依据如下几个注解实现
         * @PathVariable //获取url数据，主要注解
         *
         * @PostMapping
         * @GetMapping
         * @PutMapping
         * @DeleteMapping
    *  */

    @RequestMapping("/student1")
    public Object student1(Integer id,Integer age){
        Student student=new Student();
        student.setId(id);
        student.setAge(age);
        return student;
    }
  /*  @RequestMapping(value = "/student/detail/{id}/{age}")*/
    @GetMapping(value = "/student/detail/{id}/{age}")
    public  Object student2(@PathVariable("id") Integer id,
                            @PathVariable("age") Integer age){
        Map<String,Object> retMap = new HashMap<>();
        retMap.put("id",id);
        retMap.put("age",age);
        return retMap;
    }
  /*  @RequestMapping(value = "/student/detail/{id}/{status}")*/
    @DeleteMapping(value = "/student/detail/{id}/{status}")
    public  Object student3(@PathVariable("id") Integer id,
                            @PathVariable("status") Integer status){
        Map<String,Object> retMap = new HashMap<>();
        retMap.put("id",id);
        retMap.put("status",status);
        return retMap;
    }
    //以上代码student2和student3会出现请求路径模糊、冲突的问题
    //通常在RESTful风格中 方法的请求方式会--按照--增删改查的--请求方式--来区分
    //修改请求路径
    //RESTful请求风格要求路径中使用的单词都是名称，最好不出要出现动词

     /*分页、排序等操作，不需要使用斜杠传参数 例如： 订单列表接口 /boot/orders?page1&sort=desc
     一般传的参数不是数据库的字段可以不用采用斜杠*/

/*    @DeleteMapping(value = "/student/detail/{id}/{city}")*/
    @DeleteMapping(value = "/student/{id}/detail/{city}")
    public  Object student4(@PathVariable("id") Integer id,
                            @PathVariable("city") Integer city){
        Map<String,Object> retMap = new HashMap<>();
        retMap.put("id",id);
        retMap.put("city",city);
        return retMap;
    }

    @PostMapping(value = "/student/{id}")
    public String addStudent(@PathVariable("id") Integer id){
        return "add student ID:" + id;
    }

    @PutMapping(value = "/student/{id}")
    public String updateStudent(@PathVariable("id") Integer id){
        return "update student ID:" + id;
    }
//使用Postman测试

}
